package org.madmac.faixaIp;

import java.sql.SQLException;
import org.madmac.controller.validate.Validate;

import org.madmac.exception.CampoNaoInformadoException;

public class FaixaIpBo {

private static FaixaIpBo instance;
	
	private FaixaIpBo(){
		
	}
	
	public static FaixaIpBo getInstance(){
		if(instance == null){
			instance = new FaixaIpBo();
		}
		return instance;
	}

	public Integer validateAndCreate(FaixaIp faixaIp) throws Exception {
		// DONE: melhorar a regra de negocio para inserir faixas!
		// regra de negocio...
		if (faixaIp.getDescricao() == null || faixaIp.getDescricao().isEmpty()) {
			throw new CampoNaoInformadoException("O campo Descrição está vazio.");
		}
		try {
			if (!Validate.ipAddress(faixaIp.getFaixaIni(), faixaIp.getFaixaFim())) {
				throw new Exception("Endereços IP inválidos.");
			}
		} catch (Exception e) {
			throw new Exception(e);
		}
		return (Integer) FaixaIpDao.getInstance().create(faixaIp);
	}

	/**
	 *
	 * @param faixa
	 * @return
	 * @throws CampoNaoInformadoException
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 * @throws Exception
	 * @deprecated Use validateAndCreate(FaixaIp)
	 */
	public boolean insertFaixaIpBO (FaixaIp faixa) 
		 throws CampoNaoInformadoException, SQLException, ClassNotFoundException, Exception{
		
		/**
		 * Modificado por: Átila Camurça em 30 Jun 2009.
		 * Retorna os erros referentes a inserção de uma nova faixa de IP.
		 */

		// : melhorar a regra de negocio para inserir faixas!
		if (faixa.getDescricao() == null || faixa.getDescricao().isEmpty()) {
			throw new CampoNaoInformadoException("O campo Descrição está vazio.");
		} else if (faixa.getFaixa_in() == null || faixa.getFaixa_in().isEmpty()) {
			throw new CampoNaoInformadoException("O campo IP Inicial está vazio.");
		} else if (faixa.getFaixa_fi() == null || faixa.getFaixa_fi().isEmpty()) {
			throw new CampoNaoInformadoException("O campo IP Final está vazio."); 
		}	else if (faixa.getFaixa_in().equals(faixa.getFaixa_fi())) {
			throw new CampoNaoInformadoException("O campo IP Final deve ser diferente e maior do que o campo IP Inicial");
		} else if (!faixa.getFaixa_in().contains("/")) {
			throw new CampoNaoInformadoException("O campo IP Inicial deve conter a máscara na forma abreviada. Ex.: 10.50.0.1/8");
		} else if (!faixa.getFaixa_fi().contains("/")) {
			throw new CampoNaoInformadoException("O campo IP Final deve conter a máscara na forma abreviada. Ex.: 10.50.0.1/8");
		} else if (!faixa.getFaixa_in().contains(".")) {
			throw new CampoNaoInformadoException("O campo IP Inicial deve ser separado por pontos. Ex.: 10.50.0.1/8");
		} else if (!faixa.getFaixa_fi().contains(".")) {
			throw new CampoNaoInformadoException("O campo IP Final deve ser separado por pontos. Ex.: 10.50.0.1/8");
		}
		
		return FaixaIpDao.getInstance().insertFaixaIp(faixa);
	}
	
	public boolean updateFaixaIpBO (FaixaIp faixa, int up_id_faixa) 
		 throws CampoNaoInformadoException, SQLException, ClassNotFoundException, Exception{
		
		if(faixa.getDescricao() == null || faixa.getDescricao().isEmpty()){	
			throw new CampoNaoInformadoException("O campo Descrição está vazio.");
		}
		
		return FaixaIpDao.getInstance().updateDescricao(faixa, up_id_faixa);
	}
}
